home *** CD-ROM | disk | FTP | other *** search
- /* Copyright (c) 1991 NeXT Computer, Inc. All rights reserved.
- *
- * IdeInline.h - Ide Inline Fuctions module.
- *
- * HISTORY
- * 16-March-1993 David Somayajulu at NeXT
- * Created.
- */
-
- #define MACH_USER_API 1
- #undef KERNEL_PRIVATE
-
- #import <bsd/dev/i386/IdeCnt.h>
- #import <kern/assert.h>
- #import <driverkit/kernelDriver.h>
- #import <kernserv/prototypes.h>
- #import <mach/mach_interface.h>
- #import <driverkit/IODevice.h>
- #import <driverkit/align.h>
- #import <machkit/NXLock.h>
- #import <machdep/i386/io_inline.h>
- #import <kernserv/i386/spl.h>
-
-
-
- #if !IDE_DEBUG
- static inline
- #endif !IDE_DEBUG
- void rwSectorBuffer(caddr_t addr, unsigned read, unsigned length,
- unsigned ideDataRegister)
- {
- // length is always a multiple of two
-
- if (read){
- linw(ideDataRegister, addr, length/2);
- }else{
- loutw(ideDataRegister, addr, length/2);
- }
-
- }
-
- #if !IDE_DEBUG
- static inline
- #endif !IDE_DEBUG
- void ideXferData(caddr_t addr, unsigned read, vm_map_t client,
- unsigned length, ideRegsAddrs_t ideRegs)
- {
- // length is <= PAGE_SIZE while calling this function
-
- unsigned pageMask = PAGE_SIZE - 1;
- extern vm_map_t kernel_map;
-
- unsigned count, offset;
- unsigned short sw;
- caddr_t maddr0, maddr1;
-
-
- if ( client == kernel_map ) {
- /* simple case, no mapping required */
- rwSectorBuffer(addr, read, length,ideRegs.data);
- } else {
- /* to get the physical address here */
- offset = ((unsigned)addr & pageMask);
- if ((PAGE_SIZE - offset) < length) { /* this is a pain */
- count = PAGE_SIZE - offset;
- maddr0 = (caddr_t)pmap_resident_extract(
- vm_map_pmap((vm_map_t)client), addr);
- maddr1 = (caddr_t)pmap_resident_extract(
- vm_map_pmap((vm_map_t)client), addr+count);
- if (count % 2 ) {
- rwSectorBuffer((unsigned char *)
- pmap_phys_to_kern(maddr0),
- read, (count-1),ideRegs.data);
-
- if(read) {
- sw = inw(ideRegs.data);
- *((unsigned char *)
- pmap_phys_to_kern(maddr0+count-1)) =
- (unsigned char)(sw & 0xFF);
- *((unsigned char *)
- pmap_phys_to_kern(maddr1)) =
- (unsigned char)((sw & 0xFF)>>8);
- } else {
- sw = *((unsigned char *)
- pmap_phys_to_kern(maddr0 + count -1));
- sw |= *((unsigned char *)
- pmap_phys_to_kern(maddr1)) << 8;
- outw(ideRegs.data, sw);
- }
- maddr1++;
- rwSectorBuffer((unsigned char *)
- pmap_phys_to_kern(maddr1),
- read, (length-count-1),
- ideRegs.data);
- } else {
- rwSectorBuffer((unsigned char *)
- pmap_phys_to_kern(maddr0),
- read, count,ideRegs.data);
- rwSectorBuffer((unsigned char *)
- pmap_phys_to_kern(maddr1),
- read, (length-count),
- ideRegs.data);
- }
- } else {
- maddr0 = (caddr_t)pmap_resident_extract(
- vm_map_pmap((vm_map_t)client), addr);
- rwSectorBuffer((unsigned char *)
- pmap_phys_to_kern(maddr0),
- read, length,ideRegs.data);
- }
- }
- }
-
-